/********************************************************/
/*	Project:					*/
/*	Author:		gong_libin			*/
/*	Date:		2016_01_01			*/
/*	File:		GlbBson.h			*/
/********************************************************/

#ifndef	_GLB_BSON_H
#define	_GLB_BSON_H

#include "GlbGlobal.h"
#include <bson.h>

#define	GLB__BS_INIT			BSON_INITIALIZER

class CGlbBson
{
public:
	CGlbBson();
	virtual ~CGlbBson();

	bson_t* GlbBsonGetBson();
	bson_iter_t* GlbBsonGetIter();

	void GlbBsonInit();
	void GlbBsonReinit();
	void GlbBsonDestroy();
	void GlbBsonCopy(bson_t* pstBson);
	void GlbBsonClone(CGlbBson& rCBson);

	void GlbBsonFree(void* pMem);
	char* GlbBsonAsJson(UINT* puiLen);
	bool GlbBsonFromJson(char* pszJson, int iJson);

	bool GlbBsonIterInit();
	bool GlbBsonIterNext();
	char* GlbBsonIterKey();
	bson_type_t GlbBsonIterType();
	bool GlbBsonIterFind(char* pszKey);

	int GlbBsonGetInt32();
	bool GlbBsonGetBool();
	double GlbBsonGetDouble();
	long long GlbBsonGetInt64();
	char* GlbBsonGetUtf8(UINT* puiLen);
	void GlbBsonGetDoc(bson_iter_t* pstIter);
	void GlbBsonGetArray(bson_iter_t* pstIter);

	void GlbBsonPutBool(const char* pszField, bool bValue);
	void GlbBsonPutInt32(const char* pszField, int iValue);
	void GlbBsonPutDoc(const char* pszField, bson_t* pstDoc);
	void GlbBsonPutUtf8(const char* pszField, char* pszValue);
	void GlbBsonPutDouble(const char* pszField, double dValue);
	void GlbBsonPutArray(const char* pszField, bson_t* pstBson);
	void GlbBsonPutInt64(const char* pszField, long long llValue);

protected:

private:
	bson_t m_stBson;
	bson_iter_t m_stIter;

	void GlbBsonIterStatic(UCHAR* puszBuf, UINT uiBuf);
};

#endif /* _GLB_BSON_H */
